package com.itlin.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itlin.bean.ShoppingCart;
import com.itlin.dao.ShoppingCartDao;
import com.itlin.service.ShoppingCartService;
import com.itlin.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartDao dao;


    @Autowired
    private BaseContext baseContext;


    /**
     * 添加购物车
     *  1. 不能把购物车的添加操作，看成和以前普通的添加操作样！ 【它要涉及到更新】
     *  2. 具体操作步骤：
     *      2.1 先看看这件菜品|套餐 在表里面有还是没有
     *          a. 思考： 查看菜品|套餐在购物车表里面有还是没有，用什么条件来查看?
     *          b. 除了要考察菜品|套餐的id之外，还要考察用户的id。
     *          c. 因为很多用户都可以点一样的菜。
     *      2.2 如果没有，那么就是添加的动作
     *      2.3 如果有呢，那么就是更新的动作，更新数量即可
     *
     * @param cart
     * @return
     */
    @Override
    public ShoppingCart add(ShoppingCart cart) {

        //1. 先查询这件菜品|套餐在购物车表里面有还是没有！
        // 需要按照用户id和 菜品id 或者是 套餐id来查询
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();

        //1.1 设置条件： 用户id
        qw.eq(ShoppingCart::getUserId , baseContext.getThreadLocal());

        //1.2 设置条件： 套餐id
        qw.eq( cart.getSetmealId() != null , ShoppingCart::getSetmealId , cart.getSetmealId());

        //1.3 设置条件： 菜品id
        qw.eq(cart.getDishId() != null , ShoppingCart::getDishId , cart.getDishId());


        //2. 执行查询： 得到这件菜品|套餐在数据库里面的记录
        ShoppingCart cartInDB = dao.selectOne(qw);

        //3. 判断有还是没有！
        if(cartInDB == null ){
            //表明没有，这件菜品|套餐在数据库里面没有！ 执行添加操作

            //设置用户id
            cart.setUserId(baseContext.getThreadLocal());
            //设置创建时间
            cart.setCreateTime(LocalDateTime.now());
            //设置数量
            cart.setNumber(1);
            //添加
            dao.insert(cart);
            return cart;
        }else{
            //表明有，在数据库有这件菜品|套餐 ！ 执行更新操作
            cartInDB.setNumber(cartInDB.getNumber() +  1);
            dao.updateById(cartInDB);
            return cartInDB;
        }
    }

    /**
     * 查询购物车数据
     *
     * @return
     */
    @Override
    public List<ShoppingCart> findList() {
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , baseContext.getThreadLocal());
        qw.orderByDesc(ShoppingCart::getCreateTime);
        return dao.selectList(qw);
    }

    /**
     * 清空购物车
     *
     * @return
     */
    @Override
    public int clean() {
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , baseContext.getThreadLocal());
        return dao.delete(qw);
    }
}
